import { patch } from "./vdom/patch.js";
import Watcher from "./watcher.js";

export function lifecycleMixin(Vue) {
  // 把_update挂载在Vue的原型
  Vue.prototype._update = function (vnode) {
    const vm = this;
    const prevVnode = vm._vnode; // 保留上一次的vnode
    vm._vnode = vnode;

    if (!prevVnode) {
      // patch是渲染vnode为真实dom核心
      vm.$el = patch(vm.$el, vnode); // 初次渲染 vm._vnode肯定不存在 要通过虚拟节点 渲染出真实的dom 赋值给$el属性
    } else {
      vm.$el = patch(prevVnode, vnode); // 更新时把上次的vnode和这次更新的vnode穿进去 进行diff算法
    }
  };
}

export function mountComponent(vm, el) {

  vm.$el = el
  let updateComponent = () => {
    console.log("刷新页面");
    debugger
    vm._update(vm._render());
  };

  new Watcher(vm, updateComponent, null, true);
}

export function callHook(vm, hook) {
  const handler = vm.$options[hook]
  if(handler) {
    handler.forEach(cb => cb.call(vm))
  }
} 